{
  "openapi": "3.1.0",
  "info": {
    "title": "Open API",
    "description": "Gerencie remotamente os perfis de navegador e os runtimes de navegador na nuvem do MoreLogin pela MoreLogin Open API.\n\n**URL base**: `https://api.morelogin.com`\n\nA Open API gerencia os mesmos perfis de navegador que a Local API, mas não exige o\ncliente desktop do MoreLogin. Como nenhum cliente local está envolvido, a Open API não pode abrir um navegador\nna sua própria máquina. Em vez disso, ela pode iniciar o perfil como um **runtime na nuvem** que roda na\ninfraestrutura do MoreLogin e é controlado pelo Chrome DevTools Protocol (CDP).\n\n| Recurso | Local API | Open API |\n| --- | --- | --- |\n| Gerenciar perfis, proxies, grupos e etiquetas | Sim | Sim |\n| Abrir o navegador na sua própria máquina | Sim | Não |\n| Abrir o navegador na nuvem do MoreLogin | Sim | Sim |\n\n**Codificação dos IDs**: os IDs do MoreLogin são inteiros de 64 bits no servidor, mas são serializados em JSON como\nstrings decimais para evitar perda de precisão em JavaScript. Envie-os como strings e leia-os como strings.\n\nA autenticação usa um token Bearer OAuth2. Consulte\n[Autenticação](../Getting%20Started/authentication.md) para mais detalhes.\n",
    "version": "2026-09-05"
  },
  "servers": [
    {
      "url": "https://api.morelogin.com",
      "description": "Endpoint da MoreLogin Open API"
    }
  ],
  "security": [
    {
      "OpenApiBearer": []
    }
  ],
  "tags": [
    {
      "name": "Profiles",
      "description": "Cria, atualiza, consulta e exclui configurações de perfis de navegador."
    },
    {
      "name": "Cloud Runtime",
      "description": "Inicia, encerra, consulta e conecta perfis de navegador que rodam na nuvem do MoreLogin."
    },
    {
      "name": "Fingerprint & Device Config",
      "description": "Versões de kernel do navegador, user agents, resoluções, idiomas, fusos horários e modelos de dispositivo."
    },
    {
      "name": "Cache",
      "description": "Limpa o cache do perfil do lado da nuvem."
    }
  ],
  "paths": {
    "/env/create/quick": {
      "post": {
        "summary": "Criação rápida de perfil de navegador",
        "description": "Cria de 1 a 200 perfis de navegador que compartilham uma mesma configuração.\n- **Pré-requisitos**: o plano da equipe precisa ter perfis restantes suficientes e a cota diária de criação não pode estar esgotada. `isEncrypt=1` exige que a equipe tenha uma chave de criptografia configurada. O Firefox está disponível apenas no Windows e no macOS. Um `groupId` já precisa existir, mas passar `groupName` no lugar cria o grupo automaticamente.\n- **Efeito**: insere os perfis, consome capacidade do plano e incrementa o contador diário de criação. Passar dados de conexão de proxy também pode criar um registro de proxy.\n- **Conclusão**: sincrônica. `data` contém os IDs dos novos perfis na ordem de criação.\n- **Nova tentativa**: não é idempotente e não há chave de idempotência. Confirme com `/env/page` em vez de repetir.\n- **Open API**: nenhuma informação do cliente é lida, então você pode fixar as características da máquina com `systemBitType` e `architecture`. Os kernels vêm apenas do conjunto publicado. **Chamadas simultâneas não são serializadas**, portanto duas solicitações em paralelo podem passar as duas pela verificação de cota.\n\nErros de negócio documentados: `19002`, `19063`, `19064`, `19104`, `19106`, `19107`, `19108`, `19111`, `19112`, `14023`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para o significado de cada código. Qualquer operação também pode retornar os códigos comuns.",
        "operationId": "quickCreateBrowserProfileOpenApi",
        "tags": [
          "Profiles"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/QuickCreateRequest"
              },
              "example": {
                "quantity": 1,
                "browserTypeId": 1,
                "operatorSystemId": 1,
                "groupName": "Marketing",
                "isEncrypt": 0,
                "browserCore": 0,
                "systemBitType": 1,
                "architecture": 0
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/ApiResponseBase"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "type": "array",
                          "description": "IDs dos perfis criados, na ordem de criação.",
                          "items": {
                            "$ref": "#/components/schemas/EnvironmentId"
                          }
                        }
                      },
                      "required": [
                        "data"
                      ]
                    }
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": [
                    "1800000000000001"
                  ],
                  "requestId": "1d4f3ea968664593860b94b35d4ebf5e"
                }
              }
            }
          }
        }
      }
    },
    "/env/create/advanced": {
      "post": {
        "summary": "Criação avançada de perfil de navegador",
        "description": "Cria um perfil de navegador com uma configuração completa de impressão digital.\n- **Pré-requisitos**: as mesmas verificações de plano e cota diária da criação rápida. O nome do perfil precisa ser único dentro da equipe, as coordenadas precisam ficar fora da China continental, e `advancedSetting.ua` precisa concordar com `uaVersion`. Se você informar um `proxyId`, ele já precisa existir na equipe.\n- **Efeito**: insere o perfil, as credenciais de conta dele (criptografadas em repouso) e a configuração pós-inicialização; consome capacidade do plano e o contador diário de criação. Uma URL de plataforma personalizada também cria um registro de site.\n- **Conclusão**: sincrônica. `data` contém o ID do novo perfil.\n- **Nova tentativa**: não é idempotente. Uma segunda chamada com o mesmo `envName` explícito falha na verificação de unicidade; sem nome, cria uma duplicata. Não há chave de idempotência. Não repita às cegas depois de um timeout: consulte o estado primeiro.\n- **Open API**: nenhum sistema operacional nem versão de cliente é lido; os kernels vêm apenas do conjunto publicado. **Chamadas simultâneas não são serializadas.**\n\nErros de negócio documentados: `19001`, `19002`, `19004`, `19005`, `19063`, `19064`, `19100`, `19101`, `19102`, `19103`, `19104`, `19105`, `19106`, `19107`, `19108`, `19109`, `19110`, `19111`, `19112`, `19141`, `19175`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para o significado de cada código. Qualquer operação também pode retornar os códigos comuns.",
        "operationId": "advancedCreateBrowserProfileOpenApi",
        "tags": [
          "Profiles"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AdvancedCreateRequest"
              },
              "example": {
                "envName": "marketing-01",
                "browserTypeId": 1,
                "operatorSystemId": 1,
                "groupName": "Marketing",
                "isEncrypt": 0,
                "envRemark": "Created through the Open API",
                "uaVersion": 124,
                "browserCore": 124,
                "systemBitType": 1,
                "architecture": 0,
                "afterStartupConfig": {
                  "afterStartup": 2,
                  "autoOpenUrls": [
                    "https://example.com"
                  ],
                  "stayOnCheckIPPage": false
                },
                "startupParams": [
                  "--disable-notifications"
                ],
                "disableAudio": 0,
                "disableVideo": 0,
                "disableImg": 0
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/ApiResponseBase"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "$ref": "#/components/schemas/EnvironmentId"
                        }
                      },
                      "required": [
                        "data"
                      ]
                    }
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": "1800000000000001",
                  "requestId": "1d4f3ea968664593860b94b35d4ebf5e"
                }
              }
            }
          }
        }
      }
    },
    "/env/update": {
      "post": {
        "summary": "Modificar perfil de navegador",
        "description": "Atualiza um perfil de navegador existente. Apenas os campos presentes na solicitação são alterados.\n- **Pré-requisitos**: o perfil precisa existir na equipe. Perfis com criptografia ponta a ponta não podem ser atualizados. O sistema operacional e o tipo de navegador não podem ser alterados. Um perfil em execução pode ser atualizado.\n- **Efeito**: grava o registro do perfil, as configurações expandidas dele e os cookies, e mescla as configurações avançadas de impressão digital (os valores existentes são mantidos salvo se sobrescritos).\n- **Conclusão**: sincrônica.\n- **Nova tentativa**: é seguro repetir com o mesmo corpo. Note que não há bloqueio otimista: atualizações simultâneas de um mesmo perfil são resolvidas pela última escrita, e a mesclagem da impressão digital lê antes de gravar, então chamadas simultâneas podem perder alterações.\n- **Open API**: quando o kernel precisa ser reassociado, o sistema operacional já armazenado no perfil é usado. Nenhum sistema operacional nem versão de cliente é lido.\n\nErros de negócio documentados: `19001`, `19039`, `19104`, `19105`, `19106`, `19107`, `19108`, `19142`, `19159`, `19160`, `19175`, `19193`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para o significado de cada código. Qualquer operação também pode retornar os códigos comuns.",
        "operationId": "updateBrowserProfileOpenApi",
        "tags": [
          "Profiles"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateRequest"
              },
              "example": {
                "envId": "1800000000000001",
                "envName": "marketing-01-updated",
                "envRemark": "Updated through the Open API",
                "uaVersion": 124,
                "browserCore": 124,
                "systemBitType": 1,
                "architecture": 0
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/VoidDataResponse"
          }
        }
      }
    },
    "/env/page": {
      "post": {
        "summary": "Obter uma lista de perfis de navegador",
        "description": "Lista os perfis de navegador visíveis para o membro autenticado, página por página.\n- **Efeito**: nenhum. Somente leitura. É seguro repetir com recuo limitado.\n- **Filtragem**: `keyword` corresponde ao nome do perfil, à observação, ao nome da etiqueta e ao nome do grupo. Um `groupId` igual a `0` significa sem grupo.\n- **Observação**: as senhas de proxy são omitidas para membros comuns e para proxies de plataforma ou dinâmicos.\n- **Paginação**: começa em 1. `dataList` é um array vazio quando não há resultados.",
        "operationId": "listBrowserProfilesOpenApi",
        "tags": [
          "Profiles"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EnvPageRequest"
              },
              "example": {
                "pageNo": 1,
                "pageSize": 10,
                "keyword": "marketing"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/ApiResponseBase"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "$ref": "#/components/schemas/EnvPageData"
                        }
                      },
                      "required": [
                        "data"
                      ]
                    }
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": {
                    "total": "1",
                    "current": "1",
                    "pages": "1",
                    "dataList": [
                      {
                        "id": "1800000000000001",
                        "envName": "marketing-01",
                        "groupId": "0",
                        "groupName": "Marketing",
                        "tagInfos": [
                          {
                            "id": "1800000000000301",
                            "tagName": "important"
                          }
                        ],
                        "envRemark": "Created through the Open API",
                        "proxyId": "1800000000000101",
                        "proxy": {
                          "id": "1800000000000101",
                          "proxyName": "proxy-a",
                          "proxyType": 2,
                          "proxyProvider": 0,
                          "proxyCategoryType": 2,
                          "proxyCheckStatus": 1,
                          "proxyStatus": 0,
                          "state": "California",
                          "city": "Los Angeles",
                          "proxyPort": 1080,
                          "proxyIp": "127.0.0.1",
                          "exportIp": "203.0.113.10",
                          "countryCode": "US",
                          "expiryTime": "1786320000000",
                          "username": "user",
                          "password": "pass",
                          "refreshUrl": "https://example.com/refresh"
                        }
                      }
                    ]
                  }
                }
              }
            }
          }
        }
      }
    },
    "/env/detail": {
      "post": {
        "summary": "Obter os detalhes de um perfil de navegador",
        "description": "Retorna a configuração completa de um único perfil de navegador, incluindo configurações avançadas de impressão digital e cookies.\n- **Pré-requisitos**: o perfil precisa existir na equipe e quem chama precisa ter autorização para ele.\n- **Efeito**: nenhum. Somente leitura. É seguro repetir com recuo limitado.\n- **Observação**: as senhas de conta e os segredos 2FA só são retornados ao proprietário da equipe, ou quando o perfil não está configurado para ocultá-los.",
        "operationId": "getBrowserProfileDetailOpenApi",
        "tags": [
          "Profiles"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EnvIdRequest"
              },
              "example": {
                "envId": "1800000000000001"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/ApiResponseBase"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "$ref": "#/components/schemas/EnvDetail"
                        }
                      },
                      "required": [
                        "data"
                      ]
                    }
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": {
                    "id": "1800000000000001",
                    "envName": "marketing-01",
                    "browserTypeId": 1,
                    "operatorSystemId": 1,
                    "groupId": "0",
                    "groupName": "Marketing",
                    "tagIds": [
                      "1800000000000301"
                    ],
                    "tagInfos": [
                      {
                        "id": "1800000000000301",
                        "tagName": "important"
                      }
                    ],
                    "proxyId": "1800000000000101",
                    "isEncrypt": 0,
                    "envRemark": "Created through the Open API",
                    "uaVersion": 124,
                    "browserCore": 124,
                    "accountInfo": {
                      "username": "account@example.com",
                      "password": "secret",
                      "siteId": "1800000000000201",
                      "platformId": "9999",
                      "customerUrl": "https://example.com",
                      "otpSecret": "BASE32SECRET"
                    },
                    "isShowAccount": 0,
                    "afterStartupConfig": {
                      "afterStartup": 2,
                      "autoOpenUrls": [
                        "https://example.com"
                      ],
                      "platformUrl": "https://platform.example.com"
                    },
                    "startupParams": [
                      "--disable-notifications"
                    ],
                    "cookies": "[{\"name\":\"sid\",\"value\":\"abc\"}]",
                    "advancedSetting": {
                      "language": "en-US",
                      "timezone": "America/Los_Angeles"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/env/removeToRecycleBin/batch": {
      "post": {
        "summary": "Excluir perfis de navegador",
        "description": "Move um ou mais perfis de navegador para a lixeira.\n- **Pré-requisitos**: o perfil não pode já estar na lixeira, não pode estar em execução e não pode estar em transferência. Feche o navegador antes.\n- **Efeito**: é uma exclusão lógica. O registro, a impressão digital e o cache na nuvem são mantidos, e o perfil é marcado como reciclado com um carimbo de data e hora. A capacidade do plano é liberada imediatamente, mas o contador diário de criação não é devolvido.\n- **Conclusão**: sincrônica.\n- **Recuperação**: a restauração a partir da lixeira não está exposta na superfície da API: use o cliente do MoreLogin ou o console web.\n- **Nova tentativa**: repetir a chamada informa que o perfil já está excluído; não é possível excluir duas vezes.",
        "operationId": "batchRemoveBrowserProfilesOpenApi",
        "tags": [
          "Profiles"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "envIds": {
                    "type": "array",
                    "description": "IDs dos perfis a mover para a lixeira. Não pode estar vazio.",
                    "minItems": 1,
                    "items": {
                      "$ref": "#/components/schemas/EnvironmentId"
                    }
                  }
                },
                "required": [
                  "envIds"
                ]
              },
              "example": {
                "envIds": [
                  "1800000000000001",
                  "1800000000000002"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/BooleanDataResponse"
          }
        }
      }
    },
    "/env/lock/query": {
      "post": {
        "summary": "Obter o status de bloqueio de um perfil de navegador",
        "description": "Informa se um perfil de navegador está reservado neste momento por outro membro da equipe.\n- **Efeito**: nenhum. Somente leitura. É seguro repetir com recuo limitado.\n- **Semântica**: para ser `true` são necessárias todas estas condições: a equipe tem o recurso de bloqueio de segurança ativado, existe um bloqueio, e quem o detém é alguém diferente de quem chama. O bloqueio é detido por membro e com expiração, então pode caducar por conta própria.",
        "operationId": "queryBrowserProfileLockOpenApi",
        "tags": [
          "Profiles"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EnvIdRequest"
              },
              "example": {
                "envId": "1800000000000001"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/ApiResponseBase"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "type": "object",
                          "properties": {
                            "envId": {
                              "$ref": "#/components/schemas/EnvironmentId"
                            },
                            "locked": {
                              "type": "boolean",
                              "description": "Indica se o perfil está bloqueado por outro membro.",
                              "example": false
                            }
                          }
                        }
                      },
                      "required": [
                        "data"
                      ]
                    }
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": {
                    "envId": "1800000000000001",
                    "locked": false
                  }
                }
              }
            }
          }
        }
      }
    },
    "/env/setGroup/batch": {
      "post": {
        "summary": "Definir grupo de perfis em lote",
        "description": "Move perfis de navegador para um grupo informando o nome do grupo.\n- **Pré-requisitos**: informe pelo menos um entre `envIds` e `uniqueIds`; `groupName` é obrigatório e admite no máximo 50 caracteres. Não há como remover o grupo de um perfil por este endpoint.\n- **Efeito**: o grupo é criado automaticamente quando o nome não existe, o que **conta para o limite de 1000 grupos por equipe** e falha depois que ele é atingido. Um perfil pertence a exatamente um grupo, então o grupo anterior é substituído. Quando a sua equipe autoriza o acesso por grupo, um grupo criado aqui também é concedido a você.\n- **Conclusão**: sincrônica. A criação de grupos é serializada por equipe, então chamadas simultâneas com um nome novo não criam duplicatas.",
        "operationId": "batchSetBrowserProfileGroupOpenApi",
        "tags": [
          "Profiles"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/EnvIdsOrUniqueIds"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "groupName": {
                        "type": "string",
                        "description": "Nome do grupo de destino. Não pode estar vazio.",
                        "minLength": 1,
                        "example": "Marketing"
                      }
                    },
                    "required": [
                      "groupName"
                    ]
                  }
                ]
              },
              "example": {
                "envIds": [
                  "1800000000000001"
                ],
                "groupName": "Marketing"
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/BooleanDataResponse"
          }
        }
      }
    },
    "/env/setProxy/batch": {
      "post": {
        "summary": "Definir proxy de perfis em lote",
        "description": "Vincula um proxy a vários perfis de navegador.\n- **Pré-requisitos**: informe pelo menos um entre `envIds` e `uniqueIds`. Se você informar um `proxyId`, ele já precisa existir na equipe; caso contrário a chamada é rejeitada em vez de criar um.\n- **Efeito**: grava `proxyId` em cada perfil. Quando `proxyId` é omitido ou é `0`, um proxy existente com dados de conexão idênticos é reutilizado e, se nenhum corresponder, **um novo registro de proxy é criado na equipe que chama**.\n- **Conclusão**: sincrônica. Navegadores em execução mantêm o proxy com que iniciaram.\n- **Nova tentativa**: revincular o mesmo `proxyId` é idempotente, mas repetir uma chamada que carrega dados de conexão brutos pode criar outro registro de proxy a cada vez que a deduplicação não encontrar correspondência.\n\nErros de negócio documentados: `19106`, `19193`, `14023`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para o significado de cada código. Qualquer operação também pode retornar os códigos comuns.",
        "operationId": "batchSetBrowserProfileProxyOpenApi",
        "tags": [
          "Profiles"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/EnvIdsOrUniqueIds"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "proxy": {
                        "$ref": "#/components/schemas/ProxyInput"
                      }
                    }
                  }
                ]
              },
              "example": {
                "envIds": [
                  "1800000000000001"
                ],
                "proxy": {
                  "proxyIp": "127.0.0.1",
                  "proxyPort": 1080,
                  "proxyType": 2,
                  "proxyProvider": 0,
                  "username": "user",
                  "password": "pass"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/BooleanDataResponse"
          }
        }
      }
    },
    "/env/setRemark/batch": {
      "post": {
        "summary": "Definir observação de perfis em lote",
        "description": "Define a observação em vários perfis de navegador. Uma string vazia a limpa.\n- **Pré-requisitos**: informe pelo menos um entre `envIds` e `uniqueIds`; quem chama precisa ter autorização para cada perfil.\n- **Efeito**: grava apenas o campo de observação.\n- **Conclusão**: sincrônica. Totalmente idempotente para o mesmo corpo.",
        "operationId": "batchSetBrowserProfileRemarkOpenApi",
        "tags": [
          "Profiles"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/EnvIdsOrUniqueIds"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "envRemark": {
                        "type": "string",
                        "description": "Observação do perfil. Uma string vazia limpa a observação.",
                        "example": "Managed by automation"
                      }
                    },
                    "required": [
                      "envRemark"
                    ]
                  }
                ]
              },
              "example": {
                "envIds": [
                  "1800000000000001"
                ],
                "envRemark": "Managed by automation"
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/BooleanDataResponse"
          }
        }
      }
    },
    "/cloudbrowser/start": {
      "post": {
        "summary": "Iniciar runtime na nuvem",
        "description": "Inicia um perfil de navegador como runtime na nuvem.\n- **Pré-requisitos**: o perfil precisa existir na sua equipe e não pode estar criptografado ponta a ponta nem em transferência. **Um proxy é obrigatório** e a acessibilidade dele é verificada antes de o início ser aceito. O kernel do navegador precisa ser um que o navegador na nuvem suporte, o que exclui o Firefox. Os limites de abertura da equipe são aplicados e, em implantações com a cobrança do navegador na nuvem ativada, o saldo de créditos de IA também é verificado.\n- **Uma execução por perfil**: um membro pode ter apenas uma execução ativa por perfil. Quando a equipe ativa o bloqueio de segurança, a execução de outro membro bloqueia a sua.\n- **Conclusão**: **aceito, não concluído.** `data` está vazio; o runtime é provisionado de forma assíncrona. Consulte `/cloudbrowser/page` até que `cloudBrowserStatus` seja `RUNNING` e depois chame `/cloudbrowser/connect` para obter `cdpUrl`. Um início pode ser aceito e falhar depois, o que aparece nessa página.\n- **Concorrência**: inícios simultâneos de um perfil são serializados por um bloqueio; quem perde é rejeitado em vez de entrar na fila.\n- **Nova tentativa**: depois de um timeout, leia `/cloudbrowser/page` — não reenvie.\n\nErros de negócio documentados: `19039`, `19065`, `40001`, `40003`, `40015`, `40016`, `40021`, `40023`, `40024`, `40025`, `40026`, `40027`, `40028`, `40029`, `40037`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para o significado de cada código. Qualquer operação também pode retornar os códigos comuns.",
        "operationId": "startCloudRuntimeOpenApi",
        "tags": [
          "Cloud Runtime"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloudBrowserStartRequest"
              },
              "example": {
                "envId": "1800000000000001"
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/VoidDataResponse"
          }
        }
      }
    },
    "/cloudbrowser/stop": {
      "post": {
        "summary": "Encerrar runtime na nuvem",
        "description": "Encerra o runtime na nuvem em que um perfil está sendo executado.\n- **Pré-requisitos**: precisa existir uma execução ativa iniciada por você para esse perfil. Chamar quando o runtime já está encerrado ou sendo liberado retorna sucesso sem fazer nada.\n- **Efeito**: interrompe a cobrança, fecha o consumo, libera o bloqueio do perfil e pede ao cliente que arquive o perfil e os cookies na nuvem antes de o runtime ser liberado.\n- **Conclusão**: **aceito, não concluído.** Consulte `/cloudbrowser/page` até que `cloudBrowserStatus` seja `CLOSED` e `cloudBrowserArchiveStatus` chegue a `COMPLETED` ou `FAILED`.\n- **Quando o arquivamento falha**: a execução continua faturável e ainda aparece como `RUNNING`. O `force` é considerado **apenas** nesse estado: ele ignora o arquivamento e libera o runtime, o que descarta as alterações de perfil desta sessão.\n- **Concorrência**: encerramentos simultâneos de uma mesma execução são serializados, portanto uma chamada duplicada é segura.\n\nErros de negócio documentados: `40002`, `40006`, `40008`, `40020`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para o significado de cada código. Qualquer operação também pode retornar os códigos comuns.",
        "operationId": "stopCloudRuntimeOpenApi",
        "tags": [
          "Cloud Runtime"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloudBrowserStopRequest"
              },
              "example": {
                "envId": "1800000000000001",
                "force": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/VoidDataResponse"
          }
        }
      }
    },
    "/cloudbrowser/page": {
      "post": {
        "summary": "Listar runtimes na nuvem por página",
        "description": "Lista os perfis de navegador junto com o estado do runtime na nuvem para o membro que chama.\n- **Efeito**: nenhum. Somente leitura. É seguro repetir com recuo limitado.\n- **Valores de status**: `cloudBrowserStatus` só pode ser `STARTING`, `RUNNING` ou `CLOSED`. **`RUNNING` não significa que o navegador está utilizável**: um runtime que está sendo encerrado, sendo arquivado ou que falhou ao encerrar também é informado como `RUNNING`. O `cloudBrowserArchiveStatus` (`PENDING`, `ARCHIVING`, `COMPLETED`, `FAILED`) diferencia os dois casos e é null quando não há atividade.\n- **Consistência**: a resolução do runtime é tudo ou nada. Se não for possível resolvê-la para a página inteira, a chamada falha em vez de retornar dados parciais.",
        "operationId": "pageCloudRuntimesOpenApi",
        "tags": [
          "Cloud Runtime"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloudBrowserPageRequest"
              },
              "example": {
                "pageNo": 1,
                "pageSize": 10,
                "keyword": "marketing"
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/CloudBrowserPageResponse"
          }
        }
      }
    },
    "/cloudbrowser/connect": {
      "post": {
        "summary": "Conectar ao runtime na nuvem",
        "description": "Retorna os dados de conexão de um runtime na nuvem em execução.\n- **Pré-requisitos**: o runtime precisa estar exatamente no estado `RUNNING` e ter sido iniciado por você. Um runtime que está sendo encerrado ou arquivado é rejeitado mesmo que `/cloudbrowser/page` ainda informe `RUNNING`.\n- **Efeito**: emite um novo token de acesso ao desktop e registra você como o membro conectado.\n- **Chamadas repetidas**: o `cdpUrl` retornado é estável e as sessões CDP existentes continuam funcionando, mas cada chamada emite um novo token de desktop e sobrescreve o membro conectado registrado. **As URLs de desktop anteriores não são revogadas**, então trate cada URL retornada como uma credencial ativa: não registre em logs nem persista.\n- **Limite de sessão**: o runtime é encerrado automaticamente ao atingir sua duração máxima, e o arquivamento começa um pouco antes, então uma automação de longa duração precisa lidar com o desaparecimento do runtime.\n- **Uso**: conecte Puppeteer, Playwright ou Selenium ao `cdpUrl`.\n\nErros de negócio documentados: `40008`, `40009`, `40010`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para o significado de cada código. Qualquer operação também pode retornar os códigos comuns.",
        "operationId": "connectCloudRuntimeOpenApi",
        "tags": [
          "Cloud Runtime"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloudBrowserConnectRequest"
              },
              "example": {
                "envId": "1800000000000001"
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/CloudBrowserConnectResponse"
          }
        }
      }
    },
    "/env/advanced/ua/versions": {
      "post": {
        "summary": "Obter a lista de versões de kernel do navegador",
        "description": "Retorna os kernels de navegador publicados e as versões principais de user agent.\n- **Efeito**: nenhum. Somente leitura. É seguro repetir com recuo limitado.\n- **Conteúdo**: a superfície Open API retorna apenas kernels publicados, enquanto a superfície Local API filtra pela versão do cliente em execução, então as duas superfícies podem retornar conjuntos diferentes. A lista muda conforme novos kernels são publicados.\n- **Observação**: uma falha upstream produz uma lista vazia em vez de um erro, então trate um resultado vazio como inconclusivo.\n- **Open API**: apenas kernels publicados são retornados, independentemente de qualquer cliente.",
        "operationId": "listKernelVersionsOpenApi",
        "tags": [
          "Fingerprint & Device Config"
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "systemType": {
                    "$ref": "#/components/schemas/OperatingSystem"
                  },
                  "systemBitType": {
                    "$ref": "#/components/schemas/SystemBitType"
                  },
                  "architecture": {
                    "$ref": "#/components/schemas/Architecture"
                  }
                }
              },
              "example": {
                "systemType": 1,
                "systemBitType": 1,
                "architecture": 0
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/ApiResponseBase"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "browserType": {
                                "$ref": "#/components/schemas/BrowserType"
                              },
                              "versions": {
                                "type": "array",
                                "description": "Versões principais de UA e kernel publicadas para este tipo de navegador.",
                                "items": {
                                  "type": "integer"
                                },
                                "example": [
                                  124,
                                  123
                                ]
                              }
                            }
                          }
                        }
                      },
                      "required": [
                        "data"
                      ]
                    }
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": [
                    {
                      "browserType": 1,
                      "versions": [
                        124,
                        123
                      ]
                    }
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/env/advanced/ua/get": {
      "post": {
        "summary": "Obter o user agent do navegador",
        "description": "Gera um user agent que corresponde ao sistema operacional e ao fabricante de navegador solicitados.\n- **Pré-requisitos**: o Firefox só é válido com Windows ou macOS, e `osVersion` precisa ser uma das versões suportadas.\n- **Efeito**: nenhum, mas **o resultado não é determinístico**: a mesma solicitação retorna um user agent diferente a cada vez. Não use como chave de cache.\n- **Conclusão**: sincrônica. É seguro repetir.\n- **Open API**: apenas kernels publicados são usados para montar o user agent; nenhuma informação do cliente é lida.",
        "operationId": "getUserAgentOpenApi",
        "tags": [
          "Fingerprint & Device Config"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "os": {
                    "$ref": "#/components/schemas/OperatingSystem"
                  },
                  "osVersion": {
                    "type": "string",
                    "description": "Versão do sistema operacional. O padrão é uma string vazia.\n",
                    "enum": [
                      "",
                      "Windows 7",
                      "Windows 8",
                      "Windows 10",
                      "Windows 11",
                      "macOS 12",
                      "macOS 13",
                      "macOS 14"
                    ],
                    "example": "Windows 11"
                  },
                  "vendor": {
                    "$ref": "#/components/schemas/BrowserType"
                  },
                  "mobileDevice": {
                    "type": "string",
                    "description": "ID do modelo do dispositivo móvel. Usado em perfis Android e iOS.",
                    "example": "pixel_8"
                  },
                  "systemBitType": {
                    "$ref": "#/components/schemas/SystemBitType"
                  },
                  "architecture": {
                    "$ref": "#/components/schemas/Architecture"
                  }
                },
                "required": [
                  "os",
                  "vendor"
                ]
              },
              "example": {
                "os": 1,
                "osVersion": "Windows 11",
                "vendor": 1,
                "systemBitType": 1,
                "architecture": 0
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/ApiResponseBase"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "type": "object",
                          "properties": {
                            "ua": {
                              "type": "string",
                              "description": "User agent correspondente.",
                              "example": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
                            },
                            "resolution": {
                              "$ref": "#/components/schemas/Resolution"
                            },
                            "mobileDevice": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "ID do modelo do dispositivo móvel. Vazio para perfis de desktop.",
                              "example": null
                            }
                          }
                        }
                      },
                      "required": [
                        "data"
                      ]
                    }
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": {
                    "ua": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
                    "resolution": {
                      "id": "1920_1080",
                      "value": "1920x1080"
                    },
                    "mobileDevice": null
                  }
                }
              }
            }
          }
        }
      }
    },
    "/env/base/resolution/list": {
      "post": {
        "summary": "Obter a lista de resoluções",
        "description": "Retorna as resoluções de tela disponíveis para um user agent ou sistema operacional.\n- **Efeito**: nenhum. Somente leitura. É seguro repetir com recuo limitado.\n- **Conteúdo**: servido pelo serviço de dados base de impressões digitais, então a lista muda conforme esses dados são atualizados.",
        "operationId": "listResolutionsOpenApi",
        "tags": [
          "Fingerprint & Device Config"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "ua": {
                    "type": "string",
                    "description": "User agent usado para corresponder resoluções.",
                    "example": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
                  },
                  "os": {
                    "$ref": "#/components/schemas/OperatingSystem"
                  }
                }
              },
              "example": {
                "os": 1
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso. Retorna um array vazio quando não há correspondências.",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/ApiResponseBase"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Resolution"
                          }
                        }
                      },
                      "required": [
                        "data"
                      ]
                    }
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": [
                    {
                      "id": "1920_1080",
                      "value": "1920x1080"
                    }
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/env/base/list": {
      "post": {
        "summary": "Obter a lista de fusos horários e idiomas",
        "description": "Retorna os fusos horários e os idiomas disponíveis para perfis de navegador.\n- **Efeito**: nenhum. Somente leitura. É seguro repetir com recuo limitado.\n- **Observação**: atualmente a resposta é independente do corpo da solicitação: o serviço não repassa adiante o sistema operacional nem o idioma solicitados, então a mesma lista é retornada independentemente da entrada.",
        "operationId": "listTimezonesAndLanguagesOpenApi",
        "tags": [
          "Fingerprint & Device Config"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "os": {
                    "allOf": [
                      {
                        "$ref": "#/components/schemas/OperatingSystem"
                      }
                    ],
                    "default": 1
                  }
                }
              },
              "example": {
                "os": 1
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso. Listas vazias são retornadas como arrays vazios.",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/ApiResponseBase"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "type": "object",
                          "properties": {
                            "time_zone_list": {
                              "type": "array",
                              "items": {
                                "$ref": "#/components/schemas/IdValueOption"
                              }
                            },
                            "language_list": {
                              "type": "array",
                              "items": {
                                "$ref": "#/components/schemas/IdValueOption"
                              }
                            }
                          }
                        }
                      },
                      "required": [
                        "data"
                      ]
                    }
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "time_zone_list": [
                      {
                        "id": "America/Los_Angeles",
                        "value": "(GMT-08:00) America/Los_Angeles"
                      }
                    ],
                    "language_list": [
                      {
                        "id": "en-US",
                        "value": "English (United States)"
                      }
                    ]
                  },
                  "requestId": "1d4f3ea968664593860b94b35d4ebf5e"
                }
              }
            }
          }
        }
      }
    },
    "/env/base/mobile/devices": {
      "post": {
        "summary": "Obter a lista de modelos de telefone",
        "description": "Retorna os modelos de dispositivo móvel disponíveis para perfis de navegador Android e iOS.\n- **Efeito**: nenhum. Somente leitura. É seguro repetir com recuo limitado.\n- **Conteúdo**: a interseção entre a tabela de dispositivos do MoreLogin e o serviço de dados base de impressões digitais. Modelos presentes em apenas um dos dois são omitidos, e o `id` retornado pertence ao serviço de impressões digitais, não à tabela de dispositivos.",
        "operationId": "listMobileDevicesOpenApi",
        "tags": [
          "Fingerprint & Device Config"
        ],
        "responses": {
          "200": {
            "description": "Sucesso. Retorna um array vazio quando não há modelos disponíveis.",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/ApiResponseBase"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/MobileDevice"
                          }
                        }
                      },
                      "required": [
                        "data"
                      ]
                    }
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": [
                    {
                      "id": "pixel_8",
                      "name": "Pixel 8",
                      "resolution": "1080x2400",
                      "os": 3,
                      "platform": "Android"
                    }
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/env/fingerprint/refresh": {
      "post": {
        "summary": "Regenerar a impressão digital do perfil",
        "description": "Regenera a impressão digital de um perfil de navegador.\n- **Pré-requisitos**: identifique o perfil por `envId` ou `uniqueId`. Perfis criptografados são rejeitados. Um perfil em execução não é bloqueado, mas a nova impressão digital vale a partir da próxima inicialização.\n- **Efeito**: gera uma impressão digital nova, aleatoriza o nome do host e o endereço MAC, e reassocia o kernel do navegador. Os valores informados na solicitação prevalecem sobre os gerados.\n- **Conclusão**: sincrônica.\n- **Nova tentativa**: **nunca repita automaticamente.** Cada chamada produz uma impressão digital aleatória diferente, então uma repetição às cegas depois de um timeout altera o perfil uma segunda vez. Compare antes com `/env/detail`.\n- **Open API**: o sistema operacional da solicitação tem prioridade; quando omitido, o que está armazenado no perfil é usado para escolher um kernel publicado. Nenhuma informação do cliente é lida.\n\nErros de negócio documentados: `19039`, `19104`, `19105`, `19106`, `19107`, `19108`, `19111`, `19142`, `19193`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para o significado de cada código. Qualquer operação também pode retornar os códigos comuns.",
        "operationId": "refreshFingerprintOpenApi",
        "tags": [
          "Fingerprint & Device Config"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "envId": {
                    "allOf": [
                      {
                        "$ref": "#/components/schemas/EnvironmentId"
                      }
                    ],
                    "description": "ID do perfil. Informe este ou `uniqueId`."
                  },
                  "uniqueId": {
                    "type": "integer",
                    "format": "int32",
                    "description": "Número de sequência do perfil. Informe este ou `envId`.",
                    "example": 1001
                  },
                  "browserCore": {
                    "type": "integer",
                    "description": "Versão principal do kernel. Se for `0` ou omitido, o pareamento é automático.",
                    "minimum": 0,
                    "example": 124
                  },
                  "uaVersion": {
                    "type": "integer",
                    "description": "Versão principal do UA. Se for `0` ou omitido, é atualizado conforme as regras de negócio.",
                    "minimum": 0,
                    "example": 124
                  },
                  "browserTypeId": {
                    "$ref": "#/components/schemas/BrowserType"
                  },
                  "operatorSystemId": {
                    "$ref": "#/components/schemas/OperatingSystem"
                  },
                  "systemBitType": {
                    "$ref": "#/components/schemas/SystemBitType"
                  },
                  "architecture": {
                    "$ref": "#/components/schemas/Architecture"
                  },
                  "advancedSetting": {
                    "$ref": "#/components/schemas/AdvancedSetting"
                  }
                }
              },
              "example": {
                "envId": "1800000000000001",
                "browserCore": 124,
                "uaVersion": 124,
                "browserTypeId": 1,
                "operatorSystemId": 1,
                "systemBitType": 1,
                "architecture": 0
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/VoidDataResponse"
          }
        }
      }
    },
    "/env/cache/cleanCloud": {
      "post": {
        "summary": "Limpar cache do perfil na nuvem",
        "description": "Limpa o cache do lado da nuvem de um perfil de navegador.\n- **Pré-requisitos**: identifique o perfil por `envId` ou `uniqueId`, selecione pelo menos uma classe de cache, e o perfil não pode estar em transferência. O cache local do cliente não é tocado.\n- **Efeito**: limpar a classe geral remove LocalStorage, IndexedDB e dados de extensões na nuvem, desvincula as extensões do perfil e **redefine o tipo de criptografia do perfil**; limpar os cookies redefine o tipo de criptografia dos cookies. Ambas as mudanças são persistidas, então um perfil criptografado fica sem criptografia para a classe limpa.\n- **Conclusão**: sincrônica; o serviço de armazenamento na nuvem já aceitou e respondeu antes da resposta. Não há identificador de tarefa para consultar.\n\nErros de negócio documentados: `19039`, `19149`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para o significado de cada código. Qualquer operação também pode retornar os códigos comuns.",
        "operationId": "cleanCloudCacheOpenApi",
        "tags": [
          "Cache"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "envId": {
                    "allOf": [
                      {
                        "$ref": "#/components/schemas/EnvironmentId"
                      }
                    ],
                    "description": "ID do perfil. Informe este ou `uniqueId`."
                  },
                  "uniqueId": {
                    "type": "integer",
                    "format": "int32",
                    "description": "Número de sequência do perfil. Informe este ou `envId`.",
                    "minimum": 1,
                    "example": 1001
                  },
                  "others": {
                    "type": "boolean",
                    "description": "Indica se outros dados de cache na nuvem são limpos.",
                    "example": true
                  },
                  "cookie": {
                    "type": "boolean",
                    "description": "Indica se os cookies na nuvem são limpos.",
                    "example": false
                  }
                }
              },
              "example": {
                "envId": "1800000000000001",
                "others": true,
                "cookie": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/VoidDataResponse"
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "OpenApiBearer": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "JWT",
        "description": "Token de acesso OAuth2 obtido em `/oauth2/token`. Envie-o como `Authorization: Bearer <token>`.\nOs tokens expiram após 3600 segundos.\n"
      }
    },
    "schemas": {
      "OperatingSystem": {
        "type": "integer",
        "description": "Sistema operacional:\n- `1` — Windows\n- `2` — macOS\n- `3` — Android\n- `4` — iOS\n- `5` — Linux\n",
        "enum": [
          1,
          2,
          3,
          4,
          5
        ],
        "example": 1
      },
      "BrowserType": {
        "type": "integer",
        "description": "Tipo de navegador:\n- `1` — Chrome\n- `2` — Firefox\n",
        "enum": [
          1,
          2
        ],
        "example": 1
      },
      "SystemBitType": {
        "type": "integer",
        "description": "Arquitetura do sistema. Padrão `1`:\n- `0` — 32 bits\n- `1` — 64 bits\n",
        "enum": [
          0,
          1
        ],
        "default": 1,
        "example": 1
      },
      "Architecture": {
        "type": "integer",
        "description": "Arquitetura da CPU. Padrão `0`:\n- `0` — x86\n- `1` — ARM\n",
        "enum": [
          0,
          1
        ],
        "default": 0,
        "example": 0
      },
      "ToggleFlag": {
        "type": "integer",
        "description": "Valor do interruptor:\n- `0` — desligado\n- `1` — ligado\n",
        "enum": [
          0,
          1
        ],
        "example": 0
      },
      "ProxyType": {
        "type": "integer",
        "description": "Protocolo do proxy:\n- `0` — HTTP\n- `1` — HTTPS\n- `2` — SOCKS5\n- `3` — SSH\n",
        "enum": [
          0,
          1,
          2,
          3
        ],
        "example": 2
      },
      "ProxyProvider": {
        "type": "integer",
        "description": "Tipo de proxy. De `0` a `3` indicam um proxy simples do protocolo correspondente; `4` e acima identificam um\nserviço comercial:\n- `0` — HTTP\n- `1` — HTTPS\n- `2` — SOCKS5\n- `3` — SSH\n- `4` — Oxylabs\n- `5` — Proxys.io\n- `6` — GeoSurf\n- `7` — Luminati\n- `8` — Lumauto\n- `9` — Oxylabsauto\n- `10` — Trojan\n- `11` — Shadowsocks\n- `12` — vmess\n- `13` — ABCProxy\n- `14` — LunaProxy\n- `15` — IPHTML\n- `16` — PiaProxy\n- `17` — 922S5\n- `18` — 360Proxy\n\nTrate valores futuros desconhecidos como um serviço comercial genérico.\n",
        "example": 0
      },
      "AdvancedSetting": {
        "type": "object",
        "description": "Configuração dinâmica de impressão digital. As chaves vêm do protocolo de configurações avançadas do perfil;\ncada valor pode ser string, número, booleano, array ou objeto, dependendo da chave.\n",
        "additionalProperties": true,
        "example": {
          "language": "en-US",
          "timezone": "America/Los_Angeles"
        }
      },
      "ProxyInput": {
        "type": "object",
        "description": "Dados de conexão do proxy. Quando `proxyId` se refere a um proxy existente, esse proxy é reutilizado;\ncaso contrário, um novo proxy é criado a partir destes campos.\n",
        "properties": {
          "proxyId": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "ID de um proxy existente.",
            "example": "1800000000000101"
          },
          "proxyIp": {
            "type": "string",
            "description": "Host ou endereço IP do proxy.",
            "example": "127.0.0.1"
          },
          "proxyPort": {
            "type": "integer",
            "description": "Porta do proxy.",
            "minimum": 1,
            "maximum": 65535,
            "example": 1080
          },
          "proxyName": {
            "type": "string",
            "description": "Nome do proxy.",
            "maxLength": 600,
            "example": "proxy-a"
          },
          "proxyType": {
            "$ref": "#/components/schemas/ProxyType"
          },
          "proxyProvider": {
            "$ref": "#/components/schemas/ProxyProvider"
          },
          "ipMonitor": {
            "type": "boolean",
            "description": "Se as mudanças do IP de saída devem ser monitoradas.",
            "example": true
          },
          "ipChangeAction": {
            "type": "integer",
            "description": "Ação a tomar depois que o IP de saída muda.",
            "example": 0
          },
          "username": {
            "type": "string",
            "description": "Usuário do proxy.",
            "maxLength": 200,
            "example": "user"
          },
          "password": {
            "type": "string",
            "description": "Senha do proxy.",
            "maxLength": 100,
            "example": "pass"
          },
          "refreshUrl": {
            "type": "string",
            "description": "URL de atualização do proxy.",
            "example": "https://example.com/refresh"
          },
          "encryptionType": {
            "type": "integer",
            "description": "Tipo de criptografia do proxy.",
            "example": 0
          },
          "country": {
            "type": "string",
            "description": "País ou região.",
            "example": "US"
          },
          "state": {
            "type": "string",
            "description": "Estado ou província.",
            "example": "CA"
          },
          "city": {
            "type": "string",
            "description": "Cidade.",
            "example": "Los Angeles"
          }
        }
      },
      "AccountInfo": {
        "type": "object",
        "description": "Conta de plataforma vinculada ao perfil.",
        "properties": {
          "username": {
            "type": "string",
            "description": "Nome de usuário da conta de plataforma.",
            "maxLength": 64,
            "example": "account@example.com"
          },
          "password": {
            "type": "string",
            "description": "Senha da conta de plataforma.",
            "maxLength": 50,
            "example": "secret"
          },
          "siteId": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "ID do site.",
            "example": "1800000000000201"
          },
          "platformId": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "ID da plataforma. `9999` significa uma plataforma personalizada.",
            "example": "9999"
          },
          "customerUrl": {
            "type": "string",
            "description": "URL de plataforma personalizada. Obrigatória quando `platformId` é `9999`. Precisa ser uma URL válida.",
            "example": "https://example.com"
          },
          "otpSecret": {
            "type": "string",
            "description": "Chave secreta da autenticação de dois fatores (2FA).",
            "example": "BASE32SECRET"
          }
        },
        "required": [
          "platformId"
        ]
      },
      "AfterStartupConfigInput": {
        "type": "object",
        "description": "Comportamento aplicado após o navegador iniciar.",
        "properties": {
          "afterStartup": {
            "type": "integer",
            "description": "Comportamento de inicialização. Padrão `1`:\n- `1` — reabrir as páginas da última sessão\n- `2` — abrir as páginas indicadas\n- `3` — abrir as páginas indicadas e a plataforma\n- `4` — reabrir as páginas da última sessão e a plataforma\n",
            "enum": [
              1,
              2,
              3,
              4
            ],
            "default": 1,
            "example": 2
          },
          "autoOpenUrls": {
            "type": "array",
            "description": "Páginas a abrir automaticamente. Cada entrada precisa ser uma URL válida.",
            "items": {
              "type": "string"
            },
            "example": [
              "https://example.com"
            ]
          },
          "stayOnCheckIPPage": {
            "type": "boolean",
            "description": "Se deve permanecer na página de verificação de IP após a inicialização.",
            "example": false
          }
        }
      },
      "AfterStartupConfigDetail": {
        "type": "object",
        "description": "Comportamento aplicado após o navegador iniciar, conforme armazenado no perfil.",
        "properties": {
          "afterStartup": {
            "type": "integer",
            "description": "Comportamento de inicialização. De `1` a `4`.",
            "enum": [
              1,
              2,
              3,
              4
            ],
            "example": 2
          },
          "autoOpenUrls": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "example": [
              "https://example.com"
            ]
          },
          "platformUrl": {
            "type": [
              "string",
              "null"
            ],
            "description": "URL da plataforma aberta após a inicialização.",
            "example": "https://platform.example.com"
          }
        }
      },
      "TagInfo": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "ID da tag.",
            "example": "1800000000000301"
          },
          "tagName": {
            "type": "string",
            "description": "Nome da tag.",
            "example": "important"
          }
        }
      },
      "ProxyInfoDetail": {
        "type": "object",
        "description": "Proxy atualmente vinculado ao perfil.",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "ID do proxy.",
            "example": "1800000000000101"
          },
          "proxyName": {
            "type": "string",
            "description": "Nome do proxy.",
            "example": "proxy-a"
          },
          "proxyType": {
            "$ref": "#/components/schemas/ProxyType"
          },
          "proxyProvider": {
            "$ref": "#/components/schemas/ProxyProvider"
          },
          "proxyCategoryType": {
            "type": "integer",
            "description": "Categoria do proxy:\n- `1` — plataforma na nuvem\n- `2` — IP próprio\n",
            "enum": [
              1,
              2
            ],
            "example": 2
          },
          "proxyCheckStatus": {
            "type": "integer",
            "description": "Status da verificação de conectividade:\n- `0` — pendente\n- `1` — bem-sucedida\n- `2` — falhou\n- `3` — erro desconhecido\n",
            "enum": [
              0,
              1,
              2,
              3
            ],
            "example": 1
          },
          "proxyStatus": {
            "type": "integer",
            "description": "Status do proxy:\n- `0` — normal\n- `1` — aguardando alocação\n- `2` — em atualização\n- `3` — expirado\n",
            "enum": [
              0,
              1,
              2,
              3
            ],
            "example": 0
          },
          "state": {
            "type": [
              "string",
              "null"
            ],
            "description": "Estado ou província do proxy. Prioriza a localização detectada do IP de saída e depois a configurada; pode ser null ou uma string vazia.",
            "example": "California"
          },
          "city": {
            "type": [
              "string",
              "null"
            ],
            "description": "Cidade do proxy. Prioriza a localização detectada do IP de saída e depois a configurada; pode ser null ou uma string vazia.",
            "example": "Los Angeles"
          },
          "proxyPort": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int32",
            "description": "Porta de conexão do proxy; não é deduzida do nome. Pode ser null se indisponível.",
            "example": 1080
          },
          "proxyIp": {
            "type": "string",
            "description": "Host ou endereço IP do proxy.",
            "example": "127.0.0.1"
          },
          "exportIp": {
            "type": [
              "string",
              "null"
            ],
            "description": "Endereço IP de saída.",
            "example": "203.0.113.10"
          },
          "countryCode": {
            "type": [
              "string",
              "null"
            ],
            "description": "Código do país.",
            "example": "US"
          },
          "expiryTime": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d+$",
            "description": "Data de expiração como carimbo de tempo Unix em milissegundos.",
            "example": "1786320000000"
          },
          "username": {
            "type": [
              "string",
              "null"
            ],
            "description": "Usuário do proxy.",
            "example": "user"
          },
          "password": {
            "type": [
              "string",
              "null"
            ],
            "description": "Senha do proxy.",
            "example": "pass"
          },
          "refreshUrl": {
            "type": [
              "string",
              "null"
            ],
            "description": "URL de atualização do proxy.",
            "example": "https://example.com/refresh"
          }
        }
      },
      "Resolution": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "ID da resolução.",
            "example": "1920_1080"
          },
          "value": {
            "type": "string",
            "description": "Valor exibido.",
            "example": "1920x1080"
          }
        }
      },
      "IdValueOption": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "ID da opção.",
            "example": "en-US"
          },
          "value": {
            "type": "string",
            "description": "Valor exibido.",
            "example": "English (United States)"
          }
        }
      },
      "MobileDevice": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "ID do modelo do dispositivo.",
            "example": "pixel_8"
          },
          "name": {
            "type": "string",
            "description": "Nome do modelo do dispositivo.",
            "example": "Pixel 8"
          },
          "resolution": {
            "type": "string",
            "description": "Resolução do dispositivo.",
            "example": "1080x2400"
          },
          "os": {
            "type": "integer",
            "description": "Sistema operacional:\n- `3` — Android\n- `4` — iOS\n",
            "enum": [
              3,
              4
            ],
            "example": 3
          },
          "platform": {
            "type": "string",
            "description": "Nome da plataforma.",
            "example": "Android"
          }
        }
      },
      "EnvIdRequest": {
        "type": "object",
        "properties": {
          "envId": {
            "$ref": "#/components/schemas/EnvironmentId"
          }
        },
        "required": [
          "envId"
        ]
      },
      "EnvIdsOrUniqueIds": {
        "type": "object",
        "description": "Perfis de destino. Informe pelo menos um entre `envIds` e `uniqueIds`.",
        "properties": {
          "envIds": {
            "type": "array",
            "description": "IDs de perfis.",
            "items": {
              "$ref": "#/components/schemas/EnvironmentId"
            }
          },
          "uniqueIds": {
            "type": "array",
            "description": "Números de sequência dos perfis.",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "example": [
              1001
            ]
          }
        }
      },
      "QuickCreateRequest": {
        "type": "object",
        "properties": {
          "quantity": {
            "type": "integer",
            "description": "Quantidade de perfis a criar.",
            "minimum": 1,
            "maximum": 200,
            "example": 1
          },
          "browserTypeId": {
            "$ref": "#/components/schemas/BrowserType"
          },
          "operatorSystemId": {
            "$ref": "#/components/schemas/OperatingSystem"
          },
          "groupId": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "ID de grupo existente. `0` significa sem grupo.",
            "example": "0"
          },
          "groupName": {
            "type": "string",
            "description": "Nome do grupo. Quando informado, o grupo é localizado ou criado automaticamente.\n",
            "maxLength": 50,
            "example": "Marketing"
          },
          "isEncrypt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ToggleFlag"
              }
            ],
            "description": "Se o perfil deve ser criptografado. Padrão `0`:\n- `0` — não criptografado\n- `1` — criptografado\n"
          },
          "browserCore": {
            "type": "integer",
            "description": "Versão principal do kernel. Padrão `0`, que seleciona automaticamente um kernel publicado.",
            "minimum": 0,
            "example": 0
          },
          "systemBitType": {
            "$ref": "#/components/schemas/SystemBitType"
          },
          "architecture": {
            "$ref": "#/components/schemas/Architecture"
          },
          "proxy": {
            "$ref": "#/components/schemas/ProxyInput"
          }
        },
        "required": [
          "quantity",
          "browserTypeId",
          "operatorSystemId"
        ]
      },
      "AdvancedCreateRequest": {
        "type": "object",
        "properties": {
          "envName": {
            "type": "string",
            "description": "Nome do perfil.",
            "maxLength": 100,
            "example": "marketing-01"
          },
          "browserTypeId": {
            "$ref": "#/components/schemas/BrowserType"
          },
          "operatorSystemId": {
            "$ref": "#/components/schemas/OperatingSystem"
          },
          "groupId": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "ID de grupo existente. `0` significa sem grupo.",
            "example": "0"
          },
          "groupName": {
            "type": "string",
            "description": "Nome do grupo. Ao informar, o grupo é localizado ou criado automaticamente.",
            "maxLength": 50,
            "example": "Marketing"
          },
          "tagIds": {
            "type": "array",
            "description": "IDs de etiquetas. Um array vazio significa sem etiquetas.",
            "items": {
              "type": "string",
              "pattern": "^\\d+$"
            },
            "example": [
              "1800000000000301"
            ]
          },
          "proxyId": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "ID de proxy existente. `0` significa sem proxy.",
            "example": "0"
          },
          "proxy": {
            "$ref": "#/components/schemas/ProxyInput"
          },
          "isEncrypt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ToggleFlag"
              }
            ],
            "description": "Se o perfil deve ser criptografado. Padrão `0`."
          },
          "envRemark": {
            "type": "string",
            "description": "Observação do perfil.",
            "maxLength": 1500,
            "example": "Created through the Open API"
          },
          "uaVersion": {
            "type": "integer",
            "description": "Versão principal do UA. Padrão `0`, que significa qualquer uma.",
            "minimum": 0,
            "example": 124
          },
          "browserCore": {
            "type": "integer",
            "description": "Versão principal do kernel. Padrão `0`, que seleciona automaticamente um kernel publicado.",
            "minimum": 0,
            "example": 124
          },
          "systemBitType": {
            "$ref": "#/components/schemas/SystemBitType"
          },
          "architecture": {
            "$ref": "#/components/schemas/Architecture"
          },
          "accountInfo": {
            "$ref": "#/components/schemas/AccountInfo"
          },
          "isShowAccount": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ToggleFlag"
              }
            ],
            "description": "Interruptor de proteção por senha."
          },
          "afterStartupConfig": {
            "$ref": "#/components/schemas/AfterStartupConfigInput"
          },
          "startupParams": {
            "type": "array",
            "description": "Parâmetros de inicialização do navegador.",
            "items": {
              "type": "string"
            },
            "example": [
              "--disable-notifications"
            ]
          },
          "cookies": {
            "type": "string",
            "description": "Cookies como carga de texto JSON.",
            "example": "[{\"name\":\"sid\",\"value\":\"abc\"}]"
          },
          "advancedSetting": {
            "$ref": "#/components/schemas/AdvancedSetting"
          },
          "disableAudio": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ToggleFlag"
              }
            ],
            "description": "Se a reprodução de áudio deve ser bloqueada."
          },
          "disableVideo": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ToggleFlag"
              }
            ],
            "description": "Se o carregamento de vídeo deve ser bloqueado."
          },
          "disableImg": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ToggleFlag"
              }
            ],
            "description": "Se o carregamento de imagens deve ser bloqueado."
          },
          "imgLimitSize": {
            "type": "integer",
            "description": "Tamanho máximo da imagem a carregar, em KB.",
            "minimum": 0,
            "maximum": 100000,
            "example": 1000
          }
        },
        "required": [
          "browserTypeId",
          "operatorSystemId"
        ]
      },
      "UpdateRequest": {
        "type": "object",
        "properties": {
          "envId": {
            "allOf": [
              {
                "$ref": "#/components/schemas/EnvironmentId"
              }
            ],
            "description": "ID do perfil. A solicitação também aceita o alias de campo `id`."
          },
          "envName": {
            "type": "string",
            "description": "Nome do perfil.",
            "maxLength": 100,
            "example": "marketing-01-updated"
          },
          "groupId": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "ID do grupo. `0` significa sem grupo.",
            "example": "0"
          },
          "groupName": {
            "type": "string",
            "description": "Nome do grupo. Ao informar, o grupo é localizado ou criado automaticamente.",
            "maxLength": 50,
            "example": "Marketing"
          },
          "tagIds": {
            "type": "array",
            "description": "IDs de tags.",
            "items": {
              "type": "string",
              "pattern": "^\\d+$"
            },
            "example": [
              "1800000000000301"
            ]
          },
          "proxyId": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "ID de proxy existente. `0` significa sem proxy.",
            "example": "0"
          },
          "envRemark": {
            "type": "string",
            "description": "Observação do perfil.",
            "maxLength": 1500,
            "example": "Updated through the Open API"
          },
          "uaVersion": {
            "type": "integer",
            "description": "Versão principal do UA.",
            "minimum": 0,
            "example": 124
          },
          "browserCore": {
            "type": "integer",
            "description": "Versão principal do kernel.",
            "minimum": 0,
            "example": 124
          },
          "systemBitType": {
            "$ref": "#/components/schemas/SystemBitType"
          },
          "architecture": {
            "$ref": "#/components/schemas/Architecture"
          },
          "accountInfo": {
            "$ref": "#/components/schemas/AccountInfo"
          },
          "isShowAccount": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ToggleFlag"
              }
            ],
            "description": "Interruptor de proteção por senha."
          },
          "afterStartupConfig": {
            "$ref": "#/components/schemas/AfterStartupConfigInput"
          },
          "startupParams": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "example": [
              "--disable-notifications"
            ]
          },
          "cookies": {
            "type": "string",
            "description": "Cookies como carga de texto JSON.",
            "example": "[{\"name\":\"sid\",\"value\":\"abc\"}]"
          },
          "advancedSetting": {
            "$ref": "#/components/schemas/AdvancedSetting"
          },
          "disableAudio": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ToggleFlag"
              }
            ],
            "description": "Se a reprodução de áudio deve ser bloqueada."
          },
          "disableVideo": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ToggleFlag"
              }
            ],
            "description": "Se o carregamento de vídeo deve ser bloqueado."
          },
          "disableImg": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ToggleFlag"
              }
            ],
            "description": "Se o carregamento de imagens deve ser bloqueado."
          },
          "imgLimitSize": {
            "type": "integer",
            "description": "Tamanho máximo da imagem a carregar, em KB.",
            "minimum": 0,
            "maximum": 100000,
            "example": 1000
          },
          "hostnameSource": {
            "type": "integer",
            "description": "Origem do nome do dispositivo:\n- `0` — personalizado\n- `1` — real\n",
            "enum": [
              0,
              1
            ],
            "example": 0
          },
          "hostname": {
            "type": "string",
            "description": "Nome do dispositivo. Usado quando `hostnameSource` é `0`.",
            "example": "DESKTOP-OPENAPI"
          },
          "macAddressSource": {
            "type": "integer",
            "description": "Origem do endereço MAC:\n- `0` — personalizado\n- `1` — real\n",
            "enum": [
              0,
              1
            ],
            "example": 0
          },
          "macAddress": {
            "type": "string",
            "description": "Endereço MAC. Usado quando `macAddressSource` é `0`.",
            "example": "00:16:3E:12:34:56"
          }
        },
        "required": [
          "envId"
        ]
      },
      "EnvPageRequest": {
        "type": "object",
        "properties": {
          "uniqueIds": {
            "type": "array",
            "description": "Números de sequência dos perfis. Até 100 itens.",
            "maxItems": 100,
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "example": [
              1001
            ]
          },
          "envId": {
            "allOf": [
              {
                "$ref": "#/components/schemas/EnvironmentId"
              }
            ],
            "description": "ID do perfil. A solicitação também aceita o alias de campo `id`."
          },
          "envName": {
            "type": "string",
            "description": "Nome do perfil.",
            "example": "marketing-01"
          },
          "keyword": {
            "type": "string",
            "description": "Filtro por palavra-chave. Corresponde ao nome do perfil, ao nome do grupo, ao nome da etiqueta e à observação.",
            "example": "marketing"
          },
          "groupId": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "ID do grupo. `0` significa sem grupo.",
            "example": "0"
          },
          "pageSize": {
            "type": "integer",
            "format": "int64",
            "description": "Número de itens por página.",
            "minimum": 1,
            "maximum": 100,
            "default": 10,
            "example": 10
          },
          "pageNo": {
            "type": "integer",
            "format": "int64",
            "description": "Número da página atual, começando em 1.",
            "minimum": 1,
            "default": 1,
            "example": 1
          },
          "onlyMainAccount": {
            "type": "boolean",
            "description": "Se apenas os perfis pertencentes à conta principal devem ser retornados.",
            "example": false
          }
        },
        "required": [
          "pageNo",
          "pageSize"
        ]
      },
      "EnvListItem": {
        "type": "object",
        "properties": {
          "id": {
            "$ref": "#/components/schemas/EnvironmentId"
          },
          "envName": {
            "type": "string",
            "description": "Nome do perfil.",
            "example": "marketing-01"
          },
          "groupId": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "ID do grupo. `0` significa sem grupo.",
            "example": "0"
          },
          "groupName": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nome do grupo.",
            "example": "Marketing"
          },
          "tagInfos": {
            "type": "array",
            "description": "Tags do perfil. Array vazio quando não há nenhuma.",
            "items": {
              "$ref": "#/components/schemas/TagInfo"
            }
          },
          "envRemark": {
            "type": [
              "string",
              "null"
            ],
            "description": "Observação do perfil.",
            "example": "Created through the Open API"
          },
          "proxyId": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d+$",
            "description": "ID do proxy vinculado ao perfil.",
            "example": "1800000000000101"
          },
          "proxy": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ProxyInfoDetail"
              },
              {
                "type": "null"
              }
            ],
            "description": "Dados do proxy. `null` quando nenhum proxy está vinculado."
          }
        }
      },
      "EnvPageData": {
        "type": "object",
        "properties": {
          "total": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "Número total de registros.",
            "example": "1"
          },
          "current": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "Número da página atual.",
            "example": "1"
          },
          "pages": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "Número total de páginas.",
            "example": "1"
          },
          "dataList": {
            "type": "array",
            "description": "Perfis da página atual. Array vazio quando não há resultados.",
            "items": {
              "$ref": "#/components/schemas/EnvListItem"
            }
          }
        },
        "required": [
          "total",
          "current",
          "pages",
          "dataList"
        ]
      },
      "EnvDetail": {
        "type": "object",
        "properties": {
          "id": {
            "$ref": "#/components/schemas/EnvironmentId"
          },
          "envName": {
            "type": "string",
            "description": "Nome do perfil.",
            "example": "marketing-01"
          },
          "browserTypeId": {
            "$ref": "#/components/schemas/BrowserType"
          },
          "operatorSystemId": {
            "$ref": "#/components/schemas/OperatingSystem"
          },
          "groupId": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "ID do grupo. `0` significa sem grupo.",
            "example": "0"
          },
          "groupName": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nome do grupo.",
            "example": "Marketing"
          },
          "tagIds": {
            "type": "array",
            "description": "IDs de tags.",
            "items": {
              "type": "string",
              "pattern": "^\\d+$"
            },
            "example": [
              "1800000000000301"
            ]
          },
          "tagInfos": {
            "type": "array",
            "description": "Tags do perfil. Array vazio quando não há nenhuma.",
            "items": {
              "$ref": "#/components/schemas/TagInfo"
            }
          },
          "proxyId": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d+$",
            "description": "ID do proxy vinculado ao perfil.",
            "example": "1800000000000101"
          },
          "isEncrypt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ToggleFlag"
              }
            ],
            "description": "Se o perfil está criptografado."
          },
          "envRemark": {
            "type": [
              "string",
              "null"
            ],
            "description": "Observação do perfil.",
            "example": "Created through the Open API"
          },
          "uaVersion": {
            "type": "integer",
            "description": "Versão principal do UA.",
            "example": 124
          },
          "browserCore": {
            "type": "integer",
            "description": "Versão principal do kernel.",
            "example": 124
          },
          "accountInfo": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/AccountInfo"
              },
              {
                "type": "null"
              }
            ],
            "description": "Conta de plataforma vinculada ao perfil. `null` quando nenhuma está configurada."
          },
          "isShowAccount": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ToggleFlag"
              }
            ],
            "description": "Interruptor de proteção por senha."
          },
          "afterStartupConfig": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/AfterStartupConfigDetail"
              },
              {
                "type": "null"
              }
            ],
            "description": "Comportamento aplicado após o navegador iniciar."
          },
          "startupParams": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "example": [
              "--disable-notifications"
            ]
          },
          "cookies": {
            "type": [
              "string",
              "null"
            ],
            "description": "Cookies como carga de texto JSON.",
            "example": "[{\"name\":\"sid\",\"value\":\"abc\"}]"
          },
          "advancedSetting": {
            "$ref": "#/components/schemas/AdvancedSetting"
          }
        }
      },
      "ApiResponseBase": {
        "type": "object",
        "properties": {
          "code": {
            "type": "integer",
            "description": "Return result code. `0` means success; other codes indicate exceptions.",
            "example": 0
          },
          "msg": {
            "type": [
              "string",
              "null"
            ],
            "description": "Error message. Usually `null` on success.",
            "example": null
          },
          "requestId": {
            "type": "string",
            "description": "Operation request ID. This field may be present when the request passes through the API gateway.",
            "example": "1d4f3ea968664593860b94b35d4ebf5e"
          }
        },
        "required": [
          "code",
          "msg"
        ]
      },
      "EnvironmentId": {
        "type": "string",
        "pattern": "^[1-9]\\d*$",
        "description": "Browser profile (environment) ID. Serialized as a decimal string to avoid JavaScript\nprecision loss on 64-bit integers.\n",
        "example": "1800000000000001"
      },
      "CloudBrowserStartRequest": {
        "type": "object",
        "properties": {
          "envId": {
            "$ref": "#/components/schemas/EnvironmentId"
          }
        },
        "required": [
          "envId"
        ]
      },
      "CloudBrowserStopRequest": {
        "type": "object",
        "properties": {
          "envId": {
            "$ref": "#/components/schemas/EnvironmentId"
          },
          "force": {
            "type": "boolean",
            "description": "Whether to forcibly release the cloud runtime. Only takes effect when the current run has\nan archive status of `FAILED`; in that case the archive step is skipped and runtime\nresources are reclaimed. Ignored in all other cases.\n",
            "default": false,
            "example": false
          }
        },
        "required": [
          "envId"
        ]
      },
      "CloudBrowserPageRequest": {
        "type": "object",
        "properties": {
          "uniqueIds": {
            "type": "array",
            "description": "Environment sequence numbers. Up to 100 items.",
            "maxItems": 100,
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "example": [
              1001,
              1002
            ]
          },
          "envId": {
            "allOf": [
              {
                "$ref": "#/components/schemas/EnvironmentId"
              }
            ],
            "description": "Environment ID. The request also accepts the field alias `id`."
          },
          "envName": {
            "type": "string",
            "description": "Environment name.",
            "example": "marketing-01"
          },
          "keyword": {
            "type": "string",
            "description": "Keyword filter. Matches environment name, group name, tag name, and remark.",
            "example": "marketing"
          },
          "groupId": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "Group ID. `0` means ungrouped.",
            "example": "0"
          },
          "pageNo": {
            "type": "integer",
            "format": "int64",
            "description": "Current page number, starting from 1. Default is 1.",
            "minimum": 1,
            "default": 1,
            "example": 1
          },
          "pageSize": {
            "type": "integer",
            "format": "int64",
            "description": "Number of items per page. Default is 10, maximum 100.",
            "minimum": 1,
            "maximum": 100,
            "default": 10,
            "example": 10
          }
        },
        "required": [
          "pageNo",
          "pageSize"
        ]
      },
      "CloudBrowserStatus": {
        "type": "string",
        "description": "Cloud runtime status:\n- `STARTING` — starting up\n- `RUNNING` — running and ready to connect\n- `CLOSED` — not started, closed, or failed to start\n",
        "enum": [
          "STARTING",
          "RUNNING",
          "CLOSED"
        ],
        "example": "RUNNING"
      },
      "CloudBrowserArchiveStatus": {
        "type": [
          "string",
          "null"
        ],
        "description": "Archive status of the current cloud run. `null` when there is no active run record:\n- `PENDING` — pending archive\n- `ARCHIVING` — archiving\n- `COMPLETED` — archive completed\n- `FAILED` — archive failed\n",
        "enum": [
          "PENDING",
          "ARCHIVING",
          "COMPLETED",
          "FAILED",
          null
        ],
        "example": null
      },
      "CloudBrowserPageItem": {
        "type": "object",
        "properties": {
          "id": {
            "$ref": "#/components/schemas/EnvironmentId"
          },
          "envName": {
            "type": "string",
            "description": "Environment name.",
            "example": "marketing-01"
          },
          "proxyId": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d+$",
            "description": "Proxy ID currently bound to the profile. `null` when no proxy is configured.",
            "example": "1800000000000101"
          },
          "cloudBrowserStatus": {
            "$ref": "#/components/schemas/CloudBrowserStatus"
          },
          "cloudBrowserArchiveStatus": {
            "$ref": "#/components/schemas/CloudBrowserArchiveStatus"
          },
          "startDate": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$",
            "description": "Cloud runtime start time. `null` while starting, or when not started or closed.",
            "example": "2026-01-15 10:30:00"
          }
        },
        "required": [
          "id",
          "envName",
          "cloudBrowserStatus"
        ]
      },
      "CloudBrowserPageData": {
        "type": "object",
        "properties": {
          "total": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "Total number of records.",
            "example": "42"
          },
          "current": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "Current page number.",
            "example": "1"
          },
          "pages": {
            "type": "string",
            "pattern": "^\\d+$",
            "description": "Total number of pages.",
            "example": "5"
          },
          "dataList": {
            "type": "array",
            "description": "Environments on the current page. Empty array when there are no results.",
            "items": {
              "$ref": "#/components/schemas/CloudBrowserPageItem"
            }
          }
        },
        "required": [
          "total",
          "current",
          "pages",
          "dataList"
        ]
      },
      "CloudBrowserConnectRequest": {
        "type": "object",
        "properties": {
          "envId": {
            "$ref": "#/components/schemas/EnvironmentId"
          }
        },
        "required": [
          "envId"
        ]
      },
      "CloudBrowserConnectResult": {
        "type": "object",
        "properties": {
          "cdpUrl": {
            "type": "string",
            "description": "Full CDP (Chrome DevTools Protocol) address including the access `token` parameter. Pass this\nURL to an automation framework such as Puppeteer, Playwright, or Selenium to attach to the\nremote browser.\n",
            "example": "https://runtime1.morelogin.com:16167?token=c62fedaaac524e41a0f02fc4345d41cb"
          },
          "accessUrl": {
            "type": [
              "string",
              "null"
            ],
            "description": "Cloud browser page wrapper address. Open it in a browser to view and control the cloud\nbrowser desktop. `null` when the page wrapper is not configured.\n\nThe `token` parameter is a Base64-encoded payload carrying the desktop URL, desktop token,\nexpiry, and team, user, member, and environment IDs. The `envName` and `lang` parameters set\nthe displayed environment name and interface language.\n",
            "example": "https://official-website.morelogin.com/browser-remote?token=eyJkZXNrdG9wVXJsIjoi...ZW52SWQiOiIyMDczMzk1NDg5NzM4OTE5OTM2In0%3D&envName=P-1267&lang=en-US"
          }
        },
        "required": [
          "cdpUrl"
        ]
      }
    },
    "responses": {
      "VoidDataResponse": {
        "description": "Success",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/ApiResponseBase"
                },
                {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "null",
                      "example": null
                    }
                  }
                }
              ]
            }
          }
        }
      },
      "BooleanDataResponse": {
        "description": "Success",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/ApiResponseBase"
                },
                {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "boolean",
                      "description": "Whether the batch operation succeeded.",
                      "example": true
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              ]
            }
          }
        }
      },
      "CloudBrowserPageResponse": {
        "description": "Success",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/ApiResponseBase"
                },
                {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CloudBrowserPageData"
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              ]
            }
          }
        }
      },
      "CloudBrowserConnectResponse": {
        "description": "Success",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/ApiResponseBase"
                },
                {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CloudBrowserConnectResult"
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              ]
            },
            "example": {
              "code": 0,
              "msg": null,
              "data": {
                "cdpUrl": "https://runtime1.morelogin.com:16167?token=c62fedaaac524e41a0f02fc4345d41cb",
                "accessUrl": "https://official-website.morelogin.com/browser-remote?token=eyJkZXNrdG9wVXJsIjoi...ZW52SWQiOiIyMDczMzk1NDg5NzM4OTE5OTM2In0%3D&envName=P-1267&lang=en-US"
              },
              "requestId": "1d4f3ea968664593860b94b35d4ebf5e"
            }
          }
        }
      }
    }
  }
}